/**
 * @author Vitor Franco do Carmo (vitor.carmo@capgemini.com)
 * @since 08/08/2013
 *
 */
package br.com.vfcfw.commons.util;

import org.apache.log4j.Logger;

import br.com.vfcfw.commons.exception.BusinessException;

/**
 * Classe utilitária responsável por obter a {@link BusinessException} que pode estar encapsulada em outra exceção.
 * 
 * @author Vitor Franco do Carmo (vitor.carmo@capgemini.com)
 * @since 08/08/2013
 * 
 */
public class ExceptionUtil {

    private static final Logger LOGGER = Logger.getLogger(ExceptionUtil.class);

    private static final int QTD_MAX_EXCEPTION_FILHA = 24;

    /**
     * Construtor da classe.
     */
    private ExceptionUtil() {

        super();
    }

    /**
     * Retorna a {@link BusinessException} que pode estar encapsulada em outra exceção. <p><tt>Tenta obter descendo até
     * no máximo ao nível 25 da exceção informada.</tt></p>
     * 
     * @param exception {@link Throwable} Exceção.
     * @return {@link BusinessException} (<tt>ou a exceção original, caso a {@link BusinessException} não seja
     *         encontrada</tt>).
     */
    public static Throwable obterBusinessException(final Throwable exception) {

        Throwable causa = exception;

        LogUtil.debug(LOGGER, "Obtendo a BusinessException.");

        int contador = 0;

        do {

            if (causa instanceof BusinessException) {

                LogUtil.debug(LOGGER, "BusinessException encontrada. Retornando a exceção.");

                return causa;
            }

            causa = causa.getCause();
            contador++;

        } while (contador < QTD_MAX_EXCEPTION_FILHA && causa != null);

        return exception;
    }
}
